home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
bbsutil
/
hsrc_117.zip
/
ENTRY.C
< prev
next >
Wrap
Text File
|
1990-11-09
|
12KB
|
595 lines
/* entry.c */
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <alloc.h>
#include <mem.h>
#include <string.h>
#include <conio.h>
#include <dos.h>
#include "twindow.h"
#include "keys.h"
#define FIELDCHAR '_'
int insert_mode=FALSE;
extern int helpkey;
extern unsigned char usemouse;
/* Local prototypes */
extern void pascal print_clock(void);
void pascal addfield(WINDOW *wnd,FIELD *fld);
void pascal data_value(WINDOW *wnd,FIELD *fld);
void pascal insert_status(void);
int pascal read_field(WINDOW *wnd,FIELD *fld);
void pascal right_justify(char *s);
void pascal right_justify_zero_fill(char *s);
int pascal validate_date(char *s);
int pascal endstroke(int c);
int pascal spaces(char *c);
/* Initialize a template */
void pascal init_template(WINDOW *wnd) {
FIELD *fld,*fl;
fld=FHEAD;
while (fld) {
fl=fld->fnxt;
free(fld);
fld=fl;
}
FHEAD=NULL;
}
/* Establish a field in a template */
FIELD * pascal establish_field(wnd,cl,rw,msk,bf,ty)
WINDOW *wnd;
int rw;
int cl;
char *msk;
char *bf;
int ty;
{
FIELD *fld;
if ((fld=malloc(sizeof(FIELD)))==NULL)
return NULL;
fld->fmask=msk;
fld->frow=rw;
fld->fcol=cl;
fld->fbuff=bf;
fld->ftype=ty;
fld->fprot=0;
fld->fnxt=fld->fprv=NULL;
fld->fvalid=NULL;
fld->fhelp=NULL;
fld->fhwin=NULL;
fld->flx=fld->fly=0;
addfield(wnd,fld);
return fld;
}
/* Add a field to the end of the list */
static void pascal addfield(WINDOW *wnd,FIELD *fld) {
if (FTAIL) {
fld->fprv=FTAIL;
FTAIL->fnxt=fld;
}
FTAIL=fld;
if(!FHEAD)
FHEAD=fld;
}
/* Display a data field */
static void pascal disp_field(WINDOW *wnd,char *bf,char *msk) {
while (*msk) {
wputcharaw (wnd,*msk !=FIELDCHAR ? *msk : *bf++);
msk++;
}
}
/* Display the data value in a field */
static void pascal data_value(WINDOW *wnd,FIELD *fld) {
wcursor(wnd,fld->fcol,fld->frow);
disp_field(wnd,fld->fbuff,fld->fmask);
}
/* Display all the fields in a window */
void pascal field_tally(WINDOW *wnd)
{
FIELD *fld;
fld=FHEAD;
while(fld != NULL) {
data_value(wnd,fld);
fld=fld->fnxt;
}
}
/* Set a field's help window */
void pascal field_window(FIELD *fld,char *hwin,int x,int y) {
fld->fhwin=hwin;
fld->flx=x;
fld->fly=y;
}
/* Clear a template to all blanks */
void pascal clear_template (WINDOW *wnd) {
FIELD *fld;
char *bf,*msk;
fld=FHEAD;
while (fld != NULL) {
bf=fld->fbuff;
msk=fld->fmask;
while (*msk) {
if(*msk==FIELDCHAR)
*bf++=' ';
msk++;
}
fld=fld->fnxt;
}
field_tally(wnd);
}
/* Prepare a template to end in blanks */
void pascal prep_template (WINDOW *wnd) {
FIELD *fld;
char *bf,*msk;
fld=FHEAD;
while (fld != NULL) {
bf=fld->fbuff;
msk=fld->fmask;
while((*bf!=0) && (*msk!=0)) {
if (*msk!=FIELDCHAR) {
msk++;
continue;
}
if (*msk==0) {
break;
}
bf++;
msk++;
}
while (*msk) {
if(*msk==FIELDCHAR)
*bf++=' ';
msk++;
}
*bf=0;
fld=fld->fnxt;
}
field_tally(wnd);
}
/* Set insert/exchange cursor shape */
static void pascal insert_status() {
set_cursor_type(insert_mode ? 0x0106 : 0x0607);
}
/* Read a field from the keyboard */
static int pascal read_field (WINDOW *wnd,FIELD *fld) {
char *mask=fld->fmask,*buff=fld->fbuff;
int done=FALSE,c,column;
column=fld->fcol;
while(*mask!=FIELDCHAR) {
column++;
mask++;
}
while (TRUE) {
wcursor(wnd,column,fld->frow);
c=0;
SHOWMOUSE;
CONFINEMOUSE(wnd);
while(!kbhit()) {
if(usemouse) {
union REGS rg;
rg.x.ax=3;
int86(0x33,&rg,&rg);
move_mouse(rg.x.cx/8,rg.x.dx/8);
rg.x.ax=5;
rg.x.bx=0; /* Check left button */
int86(0x33,&rg,&rg);
if(rg.x.bx) { /* Button pressed */
rg.x.cx/=8; /* Mouse x */
rg.x.dx/=8; /* Mouse y */
if(rg.x.cx==COL && rg.x.dx==ROW) {
c=ESC;
break;
}
if(rg.x.dx==ROW && rg.x.cx==COL+WIDTH-1) {
c=PGUP;
break;
}
if(rg.x.cx==COL && rg.x.dx==ROW+HEIGHT-1) {
c=PGDN;
break;
}
if(rg.x.cx==COL+WIDTH-1 & rg.x.dx==ROW+HEIGHT-1) {
c=F10;
break;
}
if(!c) {
c=get_screen_char(rg.x.cx,rg.x.dx);
if((c=='-' || c=='X') && toupper(fld->ftype)=='O') {
if(c=='-') c='X';
else c='-';
}
}
if(!isdigit(c) && (toupper(fld->ftype)!='O' && toupper(fld->ftype)!='A')) c=0;
if(c) break;
}
rg.x.ax=3;
int86(0x33,&rg,&rg);
move_mouse(rg.x.cx/8,rg.x.dx/8);
rg.x.ax=5;
rg.x.bx=1;
int86(0x33,&rg,&rg);
if(rg.x.bx) {
c=ESC;
break;
}
rg.x.ax=3;
int86(0x33,&rg,&rg);
move_mouse(rg.x.cx/8,rg.x.dx/8);
rg.x.ax=5;
rg.x.bx=2;
int86(0x33,&rg,&rg);
if(rg.x.bx) {
c=DN;
break;
}
}
#ifdef USECLOCK
print_clock();
#endif
}
HIDEMOUSE;
if(!c)c=get_char();
if(fld->ftype=='A' || fld->ftype=='O') c=toupper(c);
clear_message();
switch(c) {
case '\b':
case BS:
if(buff==fld->fbuff) {
done=c==BS;
break;
}
--buff;
do {
--mask;
--column;
} while (*mask !=FIELDCHAR);
if (c==BS) break;
case DEL:
if(fld->ftype!='O') {
movmem(buff+1,buff,strlen(buff));
*(buff+strlen(buff))=' ';
wcursor(wnd,column,fld->frow);
disp_field(wnd,buff,mask);
}
break;
case CTRL_Y:
strset(buff,' ');
disp_field(wnd,buff,mask);
break;
case CTRL_RIGHT:
do {
column++;
mask++;
if(*mask==FIELDCHAR)buff++;
} while(*buff==' ' && *mask);
if(*mask) {
do {
column++;
mask++;
if(*mask==FIELDCHAR)buff++;
} while(*buff!=' ' && *mask);
}
break;
case CTRL_LEFT:
if(mask>fld->fmask) {
do {
--column;
--mask;
if(*mask==FIELDCHAR)--buff;
} while(*buff==' ' && mask>fld->fmask);
}
if(mask>fld->fmask) {
do {
--column;
--mask;
if(*mask==FIELDCHAR)--buff;
} while(*buff!=' ' && mask>fld->fmask);
}
break;
case END:
column=fld->fcol;
mask=fld->fmask;
buff=fld->fbuff;
do {
column++;
mask++;
if(*mask==FIELDCHAR)buff++;
} while(*mask);
while(*buff==' ' && mask>fld->fmask) {
--column;
--mask;
if(*mask==FIELDCHAR)--buff;
}
if(*buff!=' ') buff++;
break;
case HOME:
column=fld->fcol;
mask=fld->fmask;
buff=fld->fbuff;
while(*mask!=FIELDCHAR) {
column++;
mask++;
}
break;
case FWD:
do {
column++;
mask++;
} while(*mask && *mask!=FIELDCHAR);
buff++;
break;
case INS:
insert_mode ^= TRUE;
insert_status();
break;
case '.':
if (fld->ftype=='C') {
if (*mask++ && *buff==' ') {
*buff++='0';
if (*mask++ && *buff==' ')
*buff++='0';
}
right_justify(fld->fbuff);
wcursor(wnd,fld->fcol,fld->frow);
disp_field(wnd,fld->fbuff,fld->fmask);
column=fld->fcol+strlen(fld->fmask)-2;
mask=fld->fmask+strlen(fld->fmask)-2;
buff=fld->fbuff+strlen(fld->fbuff)-2;
break;
}
default:
if (endstroke(c)) {
done=TRUE;
break;
}
if (toupper(fld->ftype)!='A'&&toupper(fld->ftype)!='O'&&!isdigit(c)) {
error_message("Numbers only");
break;
}
if (toupper(fld->ftype)=='O'&& c!='X') c='-';
if (insert_mode && fld->ftype!='O') {
movmem(buff,buff+1,strlen(buff)-1);
disp_field(wnd,buff,mask);
wcursor(wnd,column,fld->frow);
}
*buff++=c;
wputcharaw(wnd,c);
do {
column++;
mask++;
} while(*mask && *mask!=FIELDCHAR);
if(!*mask)
c=FWD;
break;
}
i